<?php

namespace common\set;


use yii\helpers\ArrayHelper;
use yii\redis\Connection;

/**
 * RedisSet redis实现set集合
 *
 * Class RedisSet
 * @package common\set
 */
class RedisSet extends Connection implements SetInterface
{

    public $redis;

    /**
     * 向集合中添加一个或多个元素
     *
     * @param $members (string|array) 需要添加的元素
     * @param $set string 集合名
     * @return integer 被添加到集合中的新元素的数量
     */
    public function add($members, $set)
    {
        if (empty($set) || !is_string($set) || empty($members)) {
            return 0;
        }
        $params = [$set];
        if (is_array($members)) {
            foreach ($members as $member) {
                array_push($params, SetUtils::normalizeMember($member));
            }
        } else {
            array_push($params, SetUtils::normalizeMember($members));
        }
        $result = $this->executeCommand('SADD', $params);
        return intval($result);
    }

    /**
     * 返回集合中所有的元素
     *
     * @param $set string 集合名
     * @return array 所有元素的列表
     */
    public function all($set)
    {
        if (empty($set) || !is_string($set)) {
            return [];
        }
        $params = [$set];
        return $this->executeCommand('SMEMBERS', $params);
    }

    /**
     * 移除并返回集合中的一个随机元素
     *
     * @param $set string 集合名
     * @return string 移除的元素
     */
    public function pop($set)
    {
        if (empty($set) || !is_string($set)) {
            return '';
        }
        $params = [$set];
        $result = $this->executeCommand('SPOP', $params);
        return strval($result);
    }

    /**
     * 移除集合中的一个或多个元素
     *
     * @param $members (string|array) 要移除的元素
     * @param $set string 集合名
     * @return integer 被成功移除的元素的数量
     */
    public function remove($members, $set)
    {
        if (empty($set) || !is_string($set) || empty($members)) {
            return 0;
        }
        $params = [$set];
        if (is_array($members)) {
            $params = ArrayHelper::merge($params, $members);
        } else {
            array_push($params, $members);
        }
        $result = $this->executeCommand('SREM', $params);
        return intval($result);
    }

    /**
     * 判断元素是否在指定的集合中
     *
     * @param $member string 元素名
     * @param $set string 集合名
     * @return boolean 存在返回true，否则false
     */
    public function exists($member, $set)
    {
        if (empty($set) || !is_string($set) || !is_string($member)) {
            return false;
        }
        $params = [$set, $member];
        $result = $this->executeCommand('SISMEMBER', $params);
        return boolval($result);
    }

    /**
     * 返回集合中元素的数量
     *
     * @param $set string 集合名
     * @return integer 元素数量
     */
    public function count($set)
    {
        if (empty($set) || !is_string($set)) {
            return 0;
        }
        $params = [$set];
        $result = $this->executeCommand('SCARD', $params);
        return intval($result);
    }

    /**
     * 返回所有给定集合的交集
     *
     * @param array $sets 集合数组
     * @return array 交集成员的列表
     */
    public function inter(array $sets)
    {
        if(empty($sets) || !is_array($sets)){
           return [];
        }
        return $this->executeCommand('SINTER', $sets);
    }

    /**
     * 返回所有给定集合的并集
     *
     * @param array $sets 集合数组
     * @return array 并集成员的列表
     */
    public function union(array $sets)
    {
        if(empty($sets) || !is_array($sets)){
            return [];
        }
        return $this->executeCommand('SUNION', $sets);
    }

    /**
     * 返回所有给定集合的差集
     *
     * @param array $sets 集合数组
     * @return array 交集成员的列表
     */
    public function diff(array $sets)
    {
        if(empty($sets) || !is_array($sets)){
            return [];
        }
        return $this->executeCommand('SDIFF', $sets);
    }
}